package com.bigShen.mybatis.official;

import org.apache.ibatis.builder.xml.XMLConfigBuilder;
import org.apache.ibatis.session.Configuration;

/**
 * @author : lei.shen
 * @date : 2018/11/21
 * {@link org.apache.ibatis.builder.xml.XMLMapperBuilder#configurationElement(org.apache.ibatis.parsing.XNode)}
 */
public class MyBatisDesc {

    public static void main(String[] args) {

        /**
         *
         * mybatis-config.xml
         * Resources
         * SqlSessionFactoryBuilder (方法作用域, 使用一次，之后清除)
         * SqlSessionFactory (应用运行期)
         * SqlSession (请求 或 方法作用域)
         *
         * 流程:
         * 1. SqlSessionFactoryBuilder解析MyBatis-config.xml, 解析 typeHandler，plugin, typeAliases, mappers等,
         * 解析mapper.xml的resultType, sql, select, update, delete等，存入内存之中;
         * 2. 创建sqlSession,拿到Mapper接口, 当调用接口的方法的时候, 使用动态代理生产默认的代理类, 不需要手动写实现类,
         * 然后根据 mapper.class和method来从内存中查询对应nameSpace和select id的sql语句, 进行数据库操作;
         *
         * 解析mybatis-config.xml 和 mapper.xml :
         * {@link XMLConfigBuilder#parseConfiguration(org.apache.ibatis.parsing.XNode)}
         * {@link org.apache.ibatis.builder.xml.XMLMapperBuilder#configurationElement(org.apache.ibatis.parsing.XNode)}
         * {@link Configuration#mappedStatements}
         *
         *
         * 缓存 ：
         *   优点: 减少数据库请求
         *
         * 一级缓存 :
         *    默认开启
         *    同一个SqlSession中缓存数据
         *
         * 二级缓存 :
         *   mapper内开启
         *   每个mapper.xml单独缓存数据,所以当缓存的有联合查询的数据,如 A,B AMapper更新了A数据,
         *   BMapper内缓存的A数据并不会更新，会议脏数据
         *
         *
         *
         * Transation 事物:
         *
         * JDBC : connection, commit
         *
         * MyBatis : sqlSession, commit;
         *     分为 JdbcTransaction : 底层仍旧为 JDBC connection 管理提交
         *     ManagedTransaction
         *
         */

    }

}
